package model

import "fmt"

/*
gorm -- 映射数据库
json -- 映射json格式
form -- 映射表单输入
binding  -- 做数据校验
    gin框架内置使用validator做参数校验
    常用的简单参数校验可以直接使用bingding 添加规则即可
    gin框架使用的是github.com/go-playground/validator/v10 做校验
    当使用 shouldbind  shouldbindjson的时候 会自动去校验bingding里面的规则
    min,max 最小最大长度
    gte=10,lte=120  数值在10到120之间
    email  邮箱规则
    required  必传
*/

//创建映射到数据表的结构体
/* 通过结构体标签做映射*/
type StudentInfo struct {
	Id         uint64 `gorm:"column:id;primary_key;auto_increment" json:"id"`
	StuName    string `gorm:"column:stu_name;not null" json:"stu_name" form:"stu_name" binding:"required,max=5"`
	StuAge     uint8  `gorm:"column:stu_age;not null" json:"stu_age" form:"stu_age" binding:"required,gte=10"`
	StuSex     string `gorm:"column:stu_sex; not null" json:"stu_sex" form:"stu_sex" binding:"required"`
	StuAddress string `gorm:"column:stu_address;not null" json:"stu_address" form:"stu_address" binding:"required"`
}

func (s *StudentInfo) TableName() string {
	return "student_info"
}

// 新增
func (s *StudentInfo) Create() error {
	return DB.Self.Create(&s).Error
}

//删除  -- 删除谁？删除哪个？ 传递id
//func  DeleteUser(id uint64)  error {
//	u := &StudentInfo{Id: id}
//	return DB.Self.Delete(&u).Error
//}

func (s *StudentInfo) Delete() error {
	return DB.Self.Delete(&s).Error
}

//修改的时候  -- 告诉我修改哪个  传递id
//             修改了什么数据  接收客户端的所有数据 每次都把这条记录全部重新覆盖

func (s *StudentInfo) Update() error {
	result := DB.Self.Model(&s).Update(&s)
	return result.Error
}

// 查询  通过id查询
func GetStuById(id uint64) (*StudentInfo, error) {
	s := &StudentInfo{}
	//DB.Self.First(&s, id)  主键根据id查询
	r := DB.Self.Where("id = ?", id).First(s)
	return s, r.Error
}

// 通过名字 模糊查询  可能返回多条记录  返回切片类型
func GetStuByName(name string) ([]*StudentInfo, error) {
	stus := make([]*StudentInfo, 0)
	patter_str := fmt.Sprintf("%%%s%%", name)
	err := DB.Self.Where("stu_name LIKE ?", patter_str).Find(&stus).Error
	if err != nil {
		return stus, err
	}
	return stus, nil
}
